#!/usr/bin/python
# -*- coding: utf-8 -*-
#coding=utf-8
import datetimeDemo as tsLog
def isLeapYear(year):
    if year%400 == 0 :
        # 1，如果年份能够被 400 整除，那么这是一个闰年，例如 2000
        return True
    elif year%100 == 0 :
        # 2，如果不满足规则1，但年份是能被100整除，那么这不是一个闰年，例如 1900
        return False
    elif year%4 == 0 :
        # 3，如果不满足规则1 和 2， 但是年份能被 4 整除，那么这是一个闰年，例如 2024
        return True
    else:
        # 4，如果不满足规则1，2，3，那么这是个平年。，例如 2022
        return False


def dayNumOfYear(year, month):
    # python 没有 switch case, 使用if
    if 1 == month or 3 == month or 5 == month or 7 == month or 8 == month or 10 == month or 12 == month:
        return 31
    elif 4 == month or 6 == month or 9 == month or 11 == month:
        return 30
    else:
        # python 没有 三元运算，使用if
        if isLeapYear(year) :
            return 29
        else:
            return 28
    return 0


# 2019年1月1日是周二，以此为基准，计算一个日期对应的星期
# year闭区间[-2000, 4000]
# month 1 based
# day 1 based
# 返回 1 based week day, -1 if not a valid day

def computeWeekDayOfYear(year, month, day):
    #入参校验
    if year<-2000 or year >4000:
        return -1

    monthDayNum = dayNumOfYear(year, month);
    if 0 == monthDayNum:
        #月数字不合法
        return -1
    if day < 1 or day > monthDayNum:
        #日数字不合法
        return -1

    #计算和基准日期的差值, 2019 年1月1日 是周二
    baseYear = 2019
    baseMonth = 1
    baseDay = 1
    baseWeekDay = 1 #周二，但是用0base, 记为1

    diffDayNum = 0

    #计算累加 年的天数差值
    tmpY = baseYear
    while tmpY > year:
        #如果baseyear 比较大，逐年减小之，按平闰年累加 diffDayNum
        tmpY -= 1;
        if isLeapYear(tmpY):
            diffDayNum -= 366
        else:
            diffDayNum -= 365

    while tmpY < year:
        #如果baseyear 比较小，逐年增大之，按平闰年累加 diffDayNum
        if isLeapYear(tmpY):
            diffDayNum += 366
        else:
            diffDayNum += 365
        tmpY += 1


    # 计算累加月的天数差值
    tmpM = baseMonth
    while tmpM < month:
        # baseMonth 一定不大于 month
        # 逐月增加，累加月份天数到 diffDayNum
        diffDayNum += dayNumOfYear(year, tmpM)
        tmpM += 1

    # 计算累加 日的天数差值
    diffDayNum += day - baseDay

    weekDay = (baseWeekDay + diffDayNum) % 7  # 计算0base星期几
    if weekDay < 0:
        weekDay += 7

    weekDay += 1  # 换算成 1base 星期几
    return weekDay

def demo():
    tsLog.logTs("branchDemo", preNewLineNum=2)
    for y in range(1999, 2024):
        for m in range(2, 13):
            days = dayNumOfYear(y, m)
            #print("{}年{}月 有{}天".format(y, m, days));
            for d in range(26, 32):
                weekDay = computeWeekDayOfYear(y, m, d)
                weekStr = "无效日期" if weekDay < 0 else "星期{}".format(weekDay)
                print("{}年{}月{}日 -> ".format(y, m, d) + weekStr)
                #break
            break
        #break

if __name__ == '__main__':
    demo()